package vip.dulaogou.park;

/**
 * @author  duyouwei
 * @create  2021/4/19 13:26
 * @description
 * 停车场类
 *
 **/
public class Park {
    public static final Integer MAXSIZE = 100;   /*停车位总容量100*/
    private String name;    /*停车场名字*/
    private Car[] carArray;   /*car数组，表示车位*/
    private Integer size;   /*当前车库已经停放的车的数量*/

    public Park() { /*无参构造，默认给个名字叫myPark*/
        this("myPark");
    }

    public Park(String name) {  /*初始化*/
        this.name = name;
        carArray = new Car[MAXSIZE];
        size = 0;
    }

    public String getName() {
        return name;
    }

    public Car[] getCarArray() {
        return carArray;
    }

    public Integer getSize() {
        return size;
    }

    public void setName(String name) {
        this.name = name;
    }

    /*驶入一辆车，如果成功返回停车的车库号，如失败返回-1*/
    public Integer enter(Car car){
        /*如果传入car为null，返回null*/
        if(null == car){
            return -1;
        }

        /*遍历找该辆车是否已经停在车库了，如果已存在返回null*/
        for(int i = 0; i < carArray.length; i++){
            if(null != carArray[i] && carArray[i].equals(car)){
                return -1;
            }
        }

		/*如果size大于等于parkMaxSize，说明停车位满了，也是返回null*/
        if(size >= MAXSIZE){
            return -1;
        }

        /*
        * 一切都没问题，开始给这车找空位
        * 遍历找到一个空位，放入这辆车，并添加一个发票记录
        */
        for(int i = 0; i < carArray.length; i++){
            if(null == carArray[i]){
                carArray[i] = car;
                size++;
                //新建一条入库记录，并把该车和记录对应上
                car.setEnterRecord(new EnterRecord(car.getCarId(), i, System.currentTimeMillis()));
                //返回停车的车库号
                return i;
            }
        }
        return -1;
    }

    /*从停车场驶离一辆车，输入的是车牌号
    * 如果成功开走，返回发票，否则返回null
    * */
    public Invoice leave(String carId){
        /*当前停车位容量为0，直接返回null*/
        if(size == 0){
            return null;
        }

        /*车牌号为空，直接返回null*/
        if(null == carId){
            return null;
        }

        /*遍历找这辆车牌号的车*/
        for(int i = 0; i < carArray.length; i++){
            if(null != carArray[i] && carArray[i].getCarId().equals(carId)){
                //如果找到这辆车，找到该车的入库记录，并按照记录生成发票
                EnterRecord enterRecord = carArray[i].getEnterRecord();
                Invoice leaveInvoice = new Invoice(
                        enterRecord.getCarId(),
                        enterRecord.getParkLocation(),
                        enterRecord.getStartTime(),
                        System.currentTimeMillis());

                leaveInvoice.setIntervalTime(); /*生成间隔时间*/
                leaveInvoice.setCost(); /*生成消费金额*/

                carArray[i].setEnterRecord(null);//把该车的入库记录重置为null
                carArray[i] = null; //该车位置空
                size--;
                return leaveInvoice;
            }
        }

        /*循环结束，说明没找到车*/
        return null;
    }

    @Override
    public String toString() {
        return "Park{" +
                "name='" + name + '\'' +
                ", MAXSIZE=" + MAXSIZE +
                ", size=" + size +
                '}';
    }
}
